package com.itjh.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import java.util.Arrays;

/**
 * Description:
 *
 * @Create 2025/1/22 12:57
 */

@Slf4j
@Component
//@Aspect // 表示当前类是一个切面类(AOP类)
public class MyAspect1 {


    @Pointcut("execution(* com.itjh.service.DeptService.*(..))")
    public void pt() { }

    @Before("pt()")
    public void before(JoinPoint joinPoint) {
        log.info("before...");
    }

    @Around("pt())")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        log.info("around before...");
        //获取 目标对象的类名
        String className = pjp.getTarget().getClass().getName();
        log.info("目标类名：{}",className);
        //获取 目标方法的签名
        Signature signature = pjp.getSignature();
        log.info("目标方法的签名：{}",signature);
        //获取 目标方法的方法名
        String methodName = pjp.getSignature().getName();
        log.info("目标方法的方法名：{}",methodName);
        //获取 目标方法执行时传入的参数
        Object[] args = pjp.getArgs();
        log.info("目标方法执行时传入的参数：{}",Arrays.toString(args));
        //目标方法执行
        Object result = pjp.proceed();
        //获取 目标方法运行的返回值
        log.info("目标方法运行的返回值：{}",result);
        log.info("around after...");
        return result;
    }
}
